/* 
 * File:   IndiceRepo.cpp
 * Author: ramiro
 * 
 * Created on 24 de octubre de 2012, 09:43
 */

#include "IndiceRepo.h"

using namespace std;

IndiceRepo::IndiceRepo(const char* nombre_repo,const char* rutaRepo,unsigned int dimMatRed) {
    strcpy(clave_prim,nombre_repo);
    strcpy(directorio,rutaRepo);
    dim_mat_red = dimMatRed;
}

IndiceRepo::IndiceRepo() {
    strcpy(clave_prim,"");
    strcpy(directorio,"");
    dim_mat_red = 0;
}

IndiceRepo::~IndiceRepo() {
}

void IndiceRepo::ExisteSinoCreoArchIdxRepo(fstream* fIdxRepo){
    
    //std::fstream fIdxRepo;
    
    fIdxRepo->open(NOM_ARCH_REP,ios::binary | ios::in | ios::out);
    if(fIdxRepo->fail()){
        /*El archivo de IndiceDeRepositorios no existe*/
        cerr << "\n [ERROR]: No se pudo abrir el archivo con los repositorios \""<<NOMBRE_ARCH_REPOSITORIOS<<"\"."<<endl;
        cerr << "Probablemente es la primera vez que se correr el programa, y por lo tanto el archivo no existe.\n"<<endl;
        /*Entonces creo el archivo de Repositorios*/
        fstream fIdxRepo(NOM_ARCH_REP,ios::out);
        if(fIdxRepo.fail())
                cerr << "[ERROR]: Al crear archivo \""<<NOMBRE_ARCH_REPOSITORIOS<<"\".\n"<<endl;
        else
            fIdxRepo.close();

    }
    //return &fIdxRepo;
}

unsigned int IndiceRepo::ContarCantArchivosRepo(const char* nombreRepo){

    struct dirent *entry;
    DIR* directorio = opendir(DIRECTORIO_RAIZ);
    unsigned int cantArchivosDir = 0;
    
    while(entry = readdir(directorio)){
        if( (strcmp(entry->d_name,".")!= 0) && (strcmp(entry->d_name,"..") != 0) )
                cantArchivosDir++;
    }
    closedir(directorio);
    cout << " Cant Archivos del Repo: " << cantArchivosDir << endl;
}

void IndiceRepo::PasarPalabraAMinuscila(char* palabra){
    unsigned int i;
    
    for(i=0;i<=strlen(palabra);i++)
        palabra[i] = (char)tolower(palabra[i]);
}

bool IndiceRepo::VerificoSiNombreRepoYaExiste(std::fstream* fd,const char* nombreRepo){
    
    IndiceRepo regIdxRepo = IndiceRepo();
    bool esNecesarioIndexar = true;
    char nombreRepoAux[ANCHO_NOMBRE_REPO];
    char nombreRepoAux2[ANCHO_NOMBRE_REPO];

    strcpy(nombreRepoAux,nombreRepo);
    fd->clear();
    fd->seekg(0,ios_base::beg);
    if(!fd->fail()){
        while( !(fd->read((char*)&regIdxRepo,sizeof(IndiceRepo)).eof() ) && esNecesarioIndexar){
            strcpy(nombreRepoAux2,regIdxRepo.getNombreRepositorio());
            PasarPalabraAMinuscila(nombreRepoAux2);
            PasarPalabraAMinuscila(nombreRepoAux);
            if(strcmp(nombreRepoAux2,nombreRepoAux) == 0 ){
                //encontré el nombre del repo en el indiceDeRepos
                esNecesarioIndexar = false;
            }
        }
    }
    return esNecesarioIndexar;
}

void IndiceRepo::AgregoCaracteristicasIndexacion(std::fstream* fd,IndiceRepo regRepo){
    
    fd->seekg(0,ios_base::end);
    fd->write((char*)&regRepo,sizeof(IndiceRepo));
}

/* GETTERS*/
char* IndiceRepo::getNombreRepositorio(){
    return clave_prim;
}

char* IndiceRepo::getRutaDirectorio(){
    return directorio;
}

unsigned int IndiceRepo::getDim_mat_red(){
    return dim_mat_red;
}